package gbench.appdemo.myworld.economy.strategy;

import java.util.Arrays;
import java.util.List;
import java.util.Random;
import java.util.stream.Stream;
import gbench.appdemo.myworld.economy.demand.IDemand;
import gbench.appdemo.myworld.economy.supply.IProduct;
import gbench.appdemo.myworld.economy.supply.Product;
import gbench.appdemo.myworld.market.SimpleMarket;
import gbench.appdemo.myworld.market.commodity.Commodity;
import gbench.common.tree.LittleTree.Tuple2;

import static gbench.common.tree.LittleTree.Tuple2.*;

/**
 * 理性人假设
 * @author gbench
 *
 */
public class RationalPersonModel implements IBehaviorModel{
    
    /**
     * 
     * @param demand
     * @return
     */
    public Tuple2<IProduct,List<IDemand>> design(IDemand ...demands) {
        final IProduct product = new Product(demands[0].getName());
        //System.out.println("设计需求产品:"+product+"\n");
        return TUP2(product,Arrays.asList(demands));
    }
    
    /**
     * 获取商品集合
     * @param product 产品对象
     * @return
     */
    @Override
    public Stream<Commodity> getCommodities(IProduct product,SimpleMarket<Commodity> market) {
        //System.out.println(market.getCommodityLicenses());
        return market.getCommodityLicenses().stream()
                .map(e->e.getCommodity())
                .filter(e->e.getName().equals(product.getName()));
    }
    
    /**
     * 提出目标,根据需求设计出目标
     * @param demand
     * @return 目标产品
     */
    @Override
    public IProduct getObjective(IDemand demand) {
        final var tup = this.design(demand);
        if(tup._1()!=null) {
            //System.out.println("构造目标:"+tup);
            return tup._1();
        }else {
            System.err.println("无法伪需求设计出合理目标:"+demand);
            return null;
        }
    }
    
    /**
     * 从 数组tt 中随机选自一个 对象t
     * @param <T>
     * @param n 数组
     * @param tt
     * @return 随意选自一个 t
     */
    public static <T> T rand(T[] tt){
        int i = new Random().nextInt(tt.length);
        return tt[i];
    }
    
    /**
     * 为individual 思考一个主意
     * 在外界 event(物质条件) 刺激主观意识 启发出一个 想法主意。
     * 在客观位置条件 commodities 的情况下 表达需求。
     * 
     * @param ideaDomain 思考域
     * @return Idea
     */
    @Override
    public Idea getIdea(IdeaDomain ideaDomain,EconomyEvent event) {
        if(Math.random()>0.5)return null; // 对于一半事件不予启发出想法
        return new Idea(rand(ideaDomain.getIdeas2()));
    }

}
